Alpha Anywhere Tutorial Definition

Description

The .a5tut extension is used for defining an interactive tutorial.

Fields

Name
Property and Description
action

Track action to follow

name

Name of action

where

Fully Qualified identifier of action location in the UX.

message

HTML content to display associated with the control or subitem of a control identified by the 'where' property.

edge

Edge of control specified by the 'where' property to display the message (left, right, top, bottom).

exactMatch

For this step to complete, the value of the control specified by the 'where' property must match this value.

Can be an object rather than a string if the control specified for 'where' does not match the control for the action.

skipMatch

If the value of the control specified by the 'where' property matches this value, this step is skipped.

Can be an object rather than a string if the control specified for 'where' does not match the control for the action.

skipNotMatch

If the value of the control specified by the 'where' property does not matche this value, this step is skipped.

validateEval

This contains an optional xbasic expression, which can contain a <dlgtitle> placeholder, which gets replaced with the string of the xdialog specified by the actions 'where' property.

The expression should return a logical .t. if the action is valid (at which point, the action script will advance to the next action).

skipEval

This contains an optional xbasic expression, which can contain a <dlgtitle> placeholder, which gets replaced with the string of the xdialog specified by the actions 'where' property.

The expression should return a logical .t. if the action should be skipped.

step

Identifies this as the last action in a 'step'.

continue

Add the 'next' step to the 'page' this step is one.

skipTo

The purpose is to skip a 'block' of commands if a skip condition is met / skips to a step identfied by a label.

label

Name a target for a skipTo.

Actions

Action
Property and Description
menuSelect

Action is a menu selection , can be top menu or context menu or submenu.

controlChange

Action is result of user editing the value of a control.

controlSelect

Action is result of user selecting the value of a control.

controlClick

Action is the result of the user clicking on a control.

controlDoubleClick

Action is the result of the user double clicking on a control.

controlRightClick

Action is the result of the user right clicking on a control.

controlAny

Action is *any* action on a control (this is generally used in conjuction with an 'exactMatch' where a control value might be set via selection or editing).

viewActivate

Action is the result of the user selecting a diffent view, generally by clicking on the title section.

include

Action is placeholder for actions in another file (where property contains relative path).

ExactMatch, SkipMatch Object

Property
Description
where

Specifies the control to follow the value of.

value

Specifies the match 'value'.

Example with SkipMatch

In this example, when the tutorial script is run from the web control panel, a message will point to the 'Web Components' entry of in the Web Control Panel Selector if the 'Web Components' page is not the active page. Then a message will show up above the 'new' button.

{
    "actions": [
        {
            "action": "controlChange",
            "name": "Web Components",
            "where": "/WebControlPanel/list/Category/Web Components",
            "message": "Change Web Components control.",
            "skipMatch": "Web Components",
            "step": 1
        },
        {
            "action": "buttonClick",
            "name": "New",
            "where": "/WebControlPanel/button/New",
            "message": "Click New button.",
            "edge": "top",
            "step": 2
        },
    ]
}

Example of tracking changes to List Content

Below is a standalone tutorial code example of a dialog that has a button that adds elements to a list, and advances to the *next* step only when the list has 7 entries.

Note that exactMatch is an object instead of a string, because the action is the button click, but the value to Test is the content of the list.

Also note that the list content is denoted by the control path (/Test/list/item) with the #List suffix.

Also note that the sample xdialog uses the {where=} keyword to specify the well known name.

dim json as c = <<%json%
{
    "actions": [
        {
            "action": "buttonClick",
            "name": "Add",
            "where": "/Test/button/Add",
            "message": "Click Add button.",
            "step": 2,
            "continue" : true , 
            "exactMatch" : {
             	"where" : "/Test/list/item#List",
             	"value" :  "One\nTwo\nThree\nFour\nFive\nSix\nSeven"
            }
        },
        {
            "action": "buttonClick",
            "name": "Close",
            "where": "/Test/button/Close",
            "message": "Click Close button.",
            "step": 3
        }
    ]
}
%json%
dim uxa as WindowManager::UxAutomation
uxa.RunTutorial(json,.f.)

dim item as c
dim items as c = <<%str%
One
Two
%str%

ui_dlg_box("test",<<%dlg% {where=/Test}
[.80,20item^#items];
<Add!add><Close!close>;
%dlg%,<<%code%
if a_dlg_button = "add" then
	a_dlg_button = ""
	 items = alltrim(items) + crlf() + str(line_count(items)+1,200,0,"XF")
end if
%code%)

Example of using Xbasic expressions to Validate and Skip

If the validation or skip rules provided are not enough, there are two rules that call into xbasic that allow for arbitrarily complex validation.

The following script demonstrates a Validation rule and a Skip rule that are bound to two logical variables maintained by the example xdialog.

dim json as c = <<%json%
{
    "actions": [
        {
            "action": "buttonClick",
            "name": "Add",
            "where": "/Test/button/Add",
            "message": "Click Add button.",
            "step": 2,
            "continue" : true , 
            "validateEval" : "ui_dlg_eval(<dlgtitle>,\"valid\")"
        },
        {
            "action": "buttonClick",
            "name": "Optional",
            "where": "/Test/button/Optional",
            "message": "Click Optional button.",
            "step": 3, 
            "skipEval" : "ui_dlg_eval(<dlgtitle>,\".not. require_optional\")"
        },
        {
            "action": "buttonClick",
            "name": "Close",
            "where": "/Test/button/Close",
            "message": "Click Close button.",
            "step": 4
        }
    ]
}
%json%
dim uxa as WindowManager::UxAutomation
uxa.RunTutorial(json,.f.)

dim item as c
dim valid as l = .f.
dim require_optional as l = .f.
dim items as c = <<%str%
One
Two
%str%

ui_dlg_box("test",<<%dlg% {where=/Test}
[.80,20item^#items];
(valid!state_change) Its valid;
(require_optional!state_change) Require Optional Step;
<Add!add><Optional!optional><Close!close>;
%dlg%,<<%code%
if a_dlg_button = "add" then
	a_dlg_button = ""
	 items = alltrim(items) + crlf() + str(line_count(items)+1,200,0,"XF")
else if a_dlg_button = "optional" then
	a_dlg_button = ""
	ui_msg_box("optional step","clicking on this button is optional")
else if a_dlg_button = "state_change" then
	a_dlg_button = ""
end if
%code%)